%%%%%%%%%%%%%%%%%%%%%%% Inmatning %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% readList( -OrdLista)
% readList/1 skriver promt, laser en rad med inmatning, och konverterar 
% den inlasta teckenstrangen till en lista med atomer, kallad OrdLista. 
% Pa varandra foljande blantecken ignoreras. Ex:
%
% ?- readList(L).
% > Hello world
% L=['Hello',world]
%
% yes
% 
% ?- readList(L).
% > Observera  att      extra blanktecken  ignoreras     !
% L=['Observera',att,extra,blanktecken,ignoreras,!]
% 
% yes
%
% Predikat motsvarande readList/1 finns inbyggt i de flesta Prolog-system.

readList( OrdLista) :-
	las_rad( TeckenLista),
	ordlista( TeckenLista, [], [], OrdLista).

% las_rad( -TeckenLista)
% las_rad/1 laser en rad med inmatning (fram till nyradstecken) och ger
% som resultat motsvarande lista med ASCII-varden.
las_rad( TeckenLista) :-
	get0( EttTecken),
	las_resten( EttTecken, TeckenLista).

% las_resten/2, basfall: Senast lasta tecken var nyradstecken.
las_resten( 10, []).

% las_resten/2, rek. fall: Senast lasta tecken var inte nyradstecken,
% sa vi sparar det senast lasta tecknet och laser ett till.
las_resten( EttTecken, [EttTecken|FlerTecken]) :-
	EttTecken \== 10,
	get0( NastaTecken),
	las_resten( NastaTecken, FlerTecken).

% ordlista( -TeckenLista, +OrdHittills, +OrdListaHittills, -OrdLista)
% ordlista/4 skapar en lista med atomer utifran en lista med 
% ASCII-varden. Ex:
%
% ?- ordlista([72,101,108,108,111,32,87,111,114,108,100],[],[],L).
% 
% L=['Hello','World']
%
% yes

% Blanktecken (32), avsluta aktuellt ord och lagg till i ordlistan.
ordlista( [32|FlerTecken], [H|S], OrdListaHit, OrdLista) :-
	name( Ord, [H|S]),
	conc( OrdListaHit, [Ord], NyOrdListaHit),
	ordlista( FlerTecken, [], NyOrdListaHit, OrdLista).

% Blanktecken (32) och aktuellt ord tomt, ignorera. Hanterar fall
% med flera blanktecken efter varann.
ordlista( [32|FlerTecken], [], OrdListaHit, OrdLista) :-
	ordlista( FlerTecken, [], OrdListaHit, OrdLista).

% Ej blanktecken, bygg pa aktuellt ord.
ordlista( [EttTecken|FlerTecken], OrdHit, OrdListaHit, OrdLista) :-
	EttTecken =\= 32,
	conc( OrdHit, [EttTecken], NyOrdHit),
	ordlista( FlerTecken, NyOrdHit, OrdListaHit, OrdLista).

% Inga fler tecken, lagg till aktuellt ord i ordlistan och avsluta.
ordlista( [], Tecken, OrdListaHit, OrdLista) :-
	name( Ord, Tecken),
	conc( OrdListaHit, [Ord], OrdLista).

conc( [], L, L).
conc( [X|L1], L2, [X|L3]) :-
	conc( L1, L2, L3).







